package Controlador;

import Modelo.Chofer;
import Modelo.Cooperativa;
import Modelo.Listas;
import Modelo.Multa;
import Modelo.UnidadT;
import Modelo.Validaciones;
import Modelo.Viaje;
import Vista.JFrameViajes;
import Vista.Mensajes;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.LinkedList;

public class ControladorViajes implements ActionListener, KeyListener {

    private JFrameViajes formViajes;
    private Listas LisV;
    private Viaje viaje;

    public ControladorViajes(Listas LisViajes) {
        LisV = LisViajes;
        formViajes = new JFrameViajes();
        formViajes.AgregarListener(this, this);
        formViajes.setVisible(true);
        AsignarCodigoViaje();

        Calendar fecha = Calendar.getInstance();
        SimpleDateFormat dateFormat = new SimpleDateFormat("hh:mm aa");
        String formattedDate = dateFormat.format(new Date());
        formViajes.getHoraSalida().setText(formattedDate);
    }

    //********************************************** 
    // Opciones de Botones    
    //***********************************************    
    @Override
    public void actionPerformed(ActionEvent e) {
        //---------------------------
        //Boton generar vehiculo
        //---------------------------
        if (e.getSource().equals(formViajes.getBtnGenerarVehiculo())) {
            if(formViajes.getDateFechaSalida().getDate() == null)
            {
                Mensajes.Aviso("Ingrese una fecha de salida", "");
                return;
            }
            GenerarVehiculo();
        }
        //boton Salir
        if (e.getSource().equals(formViajes.getBtnSalirV())) {
            formViajes.dispose();
        }
        if (e.getSource().equals(formViajes.getBtnGuardarV())) {
            GuardarViaje();
        }
        if (e.getSource().equals(formViajes.getBtnEliminarV())) {
            Limpiar();
        }

        if (e.getSource().equals(formViajes.getBtnBuscarV())) {
            new ControladorConsulViajes(LisV);
        }

        if (e.getSource().equals(formViajes.getCmbRutas())) {
            ComboRutas();
        }

        
    }

    @Override
    public void keyTyped(KeyEvent e) {
       if(e.getSource().equals(formViajes.getTxtCantidadPasV()))
       {
           PasajerosKeyTyped(e);
       }
    }

    @Override
    public void keyPressed(KeyEvent e) {
        //throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void keyReleased(KeyEvent e) {
        //throw new UnsupportedOperationException("Not supported yet.");
    }

//------------------------------
    private void GenerarVehiculo() {
        Limpiar();
        int AleaVehi;
        int TamVehi;
        int AleaChofer;
        int TamChoferes;
        UnidadT unidad;
        Chofer chofer = new Chofer();

        LinkedList<Chofer> ListaChoferesCooperativa = new LinkedList<Chofer>();

        TamVehi = LisV.getListaUnidadT().size();
        

        AleaVehi = Validaciones.Generar_Aleatorio(TamVehi);
        unidad = LisV.getListaUnidadT().get(AleaVehi);
        formViajes.getTxtPlacaVehV().setText(unidad.getPlaca());
        formViajes.getTxtCISocio().setText(unidad.getCISocio());
        for(int i=0; i<LisV.getListaChoferes().size();i++)
        {
            chofer = LisV.getListaChoferes().get(i);
            if(chofer.getCISocio().equals(unidad.getCISocio()))
            {
                ListaChoferesCooperativa.add(chofer);
            }
        }
        TamChoferes = ListaChoferesCooperativa.size();
        AleaChofer = Validaciones.Generar_Aleatorio(TamChoferes);
        formViajes.getTxtChofer().setText(ListaChoferesCooperativa.get(AleaChofer).getCedula());
        
        int aleaCap = Validaciones.Generar_Aleatorio(unidad.getCapacidad());
        formViajes.getTxtCantidadPasV().setText(Integer.toString(aleaCap));
        formViajes.getTxtCodigoCoopV().setText(unidad.getCodCooperativa());
        int posCop = LisV.ExisteCoop(unidad.getCodCooperativa());
        Cooperativa coop = LisV.getListaCoop().get(posCop);
        int seguro = unidad.getCapacidad()*coop.getSeguroC();
        formViajes.getTxtSeguro().setText(Integer.toString(seguro));
        //----------------------------------------------------------------
        // estos metodos se los agregue, para que mostrara la capacidad de los vehiculos
        // ambos funcionan bien, diganme cual es mejor o si no lo consideran necesario?
        formViajes.getjLabelMax().setText("Max:" + " " + unidad.getCapacidad()); // capacidad en un label
        formViajes.getTxtCantidadPasV().setToolTipText("Max:" + " " + unidad.getCapacidad()); // capacidad en un tooltiptext
        //----------------------------------------------------------------
        formViajes.getCmbRutas().removeAllItems();
        formViajes.getCmbRutas().addItem("Seleccione una Ruta");
        for (int i = 0; i < LisV.getListaRutaCoop().size(); i++) {
            if (LisV.getListaRutaCoop().get(i).getCodigoCp().equals(unidad.getCodCooperativa())) {
                String codRuta = LisV.getListaRutaCoop().get(i).getCodigoR();
                String desRuta = "";
                for (int j = 0; j < LisV.getListaRutas().size(); j++) {
                    if (LisV.getListaRutas().get(j).getCodigoR().equals(codRuta)) {
                        desRuta = "Codigo: " + LisV.getListaRutas().get(j).getCodigoR() + " "
                                + LisV.getListaRutas().get(j).getDestino();
                    }
                }
                formViajes.getCmbRutas().addItem(desRuta);
            }
        }
        formViajes.getCmbRutas().setSelectedIndex(0);
    }


//----------------------------------------------------------------
    // es necesario que al guardar los viajes, se registre el chofer que manejara 
    // dicha unidad. ya que para los reportes es necesario eso.
    private void GuardarViaje() {
        Viaje viaje = new Viaje();
        String Cadena;

        Cadena = formViajes.getTxtFechaLlegada().getText();
        if (Cadena.length() == 0) {
            Mensajes.Aviso("Fecha de llegada Vacia", "");
            formViajes.getTxtFechaLlegada().requestFocusInWindow();
            return;
        }

       
        Cadena = formViajes.getTxtCantidadPasV().getText();
        if (Cadena.length() == 0) {
            Mensajes.Aviso("Cantidad de pasajeros Vacia", "");
            formViajes.getTxtCantidadPasV().requestFocusInWindow();
            return;
        }
        int capacidad = 0;
        for (int i = 0; i < LisV.getListaUnidadT().size(); i++) {
            if (LisV.getListaUnidadT().get(i).getPlaca().equals(formViajes.getTxtPlacaVehV().getText())) {
                capacidad = LisV.getListaUnidadT().get(i).getCapacidad();
            }
        }
        if (Integer.parseInt(Cadena) > capacidad) {
            Mensajes.Aviso("Cantidad de pasajeros excedida\n" + "Capacidad Máxima: " + capacidad, "");
            formViajes.getTxtCantidadPasV().requestFocusInWindow();
            return;
        }

        Cadena = formViajes.getCmbRutas().getSelectedItem().toString();
        if (Cadena.equals("Seleccione una Ruta")) {
            Mensajes.Aviso("Seleccione una Ruta", "");
            formViajes.getCmbRutas().requestFocusInWindow();
            return;
        }
        String dest = "";
        String[] dato;
        dato = Cadena.split(" ");
        for (int i = 2; i < dato.length; i++) {
            dest = dest + dato[i] + " ";
        }
        viaje.Viaje(formViajes.getCodViaje().getText(),
                formViajes.getTxtPlacaVehV().getText(),
                formViajes.getTxtCISocio().getText(),
                formViajes.getTxtChofer().getText(),
                formViajes.getTxtCodigoCoopV().getText(),
                formViajes.getDateFechaSalida().getDate(),
                formViajes.getHoraSalida().getText(),
                dest,
                Validaciones.CnvStringFecha(formViajes.getTxtFechaLlegada().getText()),
                formViajes.getTxtHoraLLegadaV().getText(),
                Integer.parseInt(formViajes.getTxtCantidadPasV().getText()));
        
        
          //---------ORDENAR VIAJES POR FECHA DESCENDENTE--------

        Viaje viaje_i = new Viaje();
        Viaje viaje_j = new Viaje();
        
            
        
        for (int i = 0; i < LisV.getListaViajes().size() - 1; i++) 
        {
            for (int j = i + 1; j < LisV.getListaViajes().size(); j++) 
            {
                viaje_i = LisV.getListaViajes().get(i);
                viaje_j = LisV.getListaViajes().get(j);

                if (viaje_i.getFechaSalida().compareTo(viaje_j.getFechaSalida()) < 0) 
                {
                    LisV.getListaViajes().set(i, viaje_j);
                    LisV.getListaViajes().set(j, viaje_i);
                }
            }
        }
        //------------------------
        /*
        if(LisV.getListaViajes().size()>0)
        {
        int ultViaVeh = LisV.UltimoViajeVehiculo(viaje.getPlacaVehiculo());
        Viaje ultViajeVeh = LisV.getListaViajes().get(ultViaVeh);
        if(ultViajeVeh.getFechaRegreso().after(viaje.getFechaSalida()))
        {
            Mensajes.Aviso("Este vehiculo no esta disponible", Cadena);
            Limpiar();
            return;
        }
        }
        */
        int posMulta = LisV.ExisteMulta(viaje.getPlacaVehiculo());
        if (posMulta !=-1) 
        {
            Multa multa = new Multa();
            multa = LisV.getListaMultas().get(posMulta);
            Date finMulta = Validaciones.sumarFechasDias(multa.getDiaFeriado(), 3);
            
            if(viaje.getFechaSalida().compareTo(finMulta)<=0)
            {
                Mensajes.Aviso("Este vehiculo esta multado", Cadena);
                Limpiar();
                return;
            }
            else
            {
                LisV.getListaViajes().add(viaje);
                Mensajes.Aviso("Viaje registrado con exito", "");
                Limpiar();
                AsignarCodigoViaje();
                formViajes.getBtnBuscarV().requestFocusInWindow();
            }
            
        } 
        else 
        {
            LisV.getListaViajes().add(viaje);
            Mensajes.Aviso("Viaje registrado con exito", "");
            Limpiar();
            AsignarCodigoViaje();
            formViajes.getBtnBuscarV().requestFocusInWindow();
        }
    }

    private void ComboRutas() {
        if (formViajes.getCmbRutas().getSelectedIndex() > -1) {
            int dias, horas, min;
            Date fecha;
            String[] arrCod;
            String codRuta, dura;
            String datoRuta = formViajes.getCmbRutas().getSelectedItem().toString();
            arrCod = datoRuta.split(" ");
            codRuta = arrCod[1];
            if (!datoRuta.equals("Seleccione una Ruta") & !datoRuta.equals("")) {
                for (int i = 0; i < LisV.getListaRutas().size(); i++) {
                    if (LisV.getListaRutas().get(i).getCodigoR().equals(codRuta)) {
                        dura = LisV.getListaRutas().get(i).getDuracion();
                        arrCod = dura.split(" ");
                        dias = Integer.parseInt(arrCod[0]);
                        horas = Integer.parseInt(arrCod[1]);
                        min = Integer.parseInt(arrCod[2]);
                        SumarDuracionFecha(formViajes.getDateFechaSalida().getDate(),
                                formViajes.getHoraSalida().getText(),
                                dias, horas, min);
                    }
                }
            }
        }
    }

    private void SumarDuracionFecha(Date fecha, String hora, int dias, int horas, int min) {

        String[] dato;
        String ampm, tokenHora;
        int d = 0, h = 0, m = 0;
        dato = hora.split(" ");
        ampm = dato[1];
        tokenHora = dato[0];
        dato = tokenHora.split(":");
        h = Integer.parseInt(dato[0]);
        m = Integer.parseInt(dato[1]);
        d = dias;
        if (min + m > 60) {
            m = min + m - 60;
            h = h + 1;
        } else {
            m = min + m;
        }
        if (horas <= 12) {
            if (h + horas > 12 & ampm.equals("PM")) {
                ampm = "AM";
                h = h + horas - 12;
                d = d + 1;
            } else if (h + horas > 12 & ampm.equals("AM")) {
                ampm = "AM";
                h = h + horas - 12;
            } else {
                h = h + horas;
            }
        } else if (horas > 12) {
            if (h + horas > 24 & ampm.equals("PM")) {
                ampm = "AM";
                h = h + horas - 24;
                d = d + 1;
            } else if (h + horas > 24 & ampm.equals("AM")) {
                ampm = "PM";
                h = h + horas - 24;
            } else {
                h = h + horas - 12;
            }

        }

        fecha = Validaciones.sumarFechasDias(formViajes.getDateFechaSalida().getDate(), d);
        DateFormat df = DateFormat.getDateInstance();
        String f = df.format(fecha);
        formViajes.getTxtFechaLlegada().setText(f);
        formViajes.getTxtHoraLLegadaV().setText(h + ":" + m + " " + ampm);
    }

    private void AsignarCodigoViaje() {
        int nroV = LisV.getListaViajes().size() + 1;
        formViajes.getCodViaje().setText("V000" + nroV);
    }

    private void Limpiar() {
        formViajes.getTxtCISocio().setText("");
        formViajes.getTxtPlacaVehV().setText("");
        formViajes.getTxtCodigoCoopV().setText("");
        formViajes.getTxtCantidadPasV().setText("");
        formViajes.getTxtFechaLlegada().setText("");
        formViajes.getTxtHoraLLegadaV().setText("");
        formViajes.getCmbRutas().setSelectedIndex(-1);
        formViajes.getTxtChofer().setText("");
        formViajes.getjLabelMax().setText("");
        formViajes.getTxtSeguro().setText("");
        formViajes.getBtnBuscarV().requestFocusInWindow();
    }
    //-----------------------
   private void PasajerosKeyTyped(KeyEvent evt) {
        String Cadena;
        char Caracter;

        Cadena = formViajes.getTxtCantidadPasV().getText();
        if (Cadena.length() == 2) 
        {
            evt.consume();
        } else 
        {
            Caracter = evt.getKeyChar();

            if (Caracter == '.') {
                evt.consume();
            }

            if (Caracter < '0' || Caracter > '9') {
                evt.consume();
            }
        }

    }
}
